﻿#ifndef QQMUSIC_H
#define QQMUSIC_H

#include <QWidget>
#include <QGraphicsDropShadowEffect>
#include <QMouseEvent>
#include <QDebug>
#include <QJsonArray>
#include <QJsonObject>
#include <volumetool.h>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QPropertyAnimation>
#include <QSqlDatabase>

#include "commonpage.h"
#include "musiclist.h"
#include "lrcpage.h"

QT_BEGIN_NAMESPACE
namespace Ui {
class QQMusic;
}
QT_END_NAMESPACE

class QQMusic : public QWidget
{
    Q_OBJECT

public:
    QQMusic(QWidget *parent = nullptr);
    ~QQMusic();

    void initUi();

    void initSqlite();

    void initMusicList();

    void connectSignalAndSlots();

    QJsonArray randomPiction();

    // 媒体播放相关初始化
    void initPlayer();

    void updateBtfromAnimal(); // 在哪个窗口播放音乐,btfrom就在哪个按钮上显示

    void onQuitQQMusic();// 托盘退出

protected:
    //实现窗口拖拽的功能
    //1鼠标的左键按压(一直按压);2.鼠标左键按压的同时:鼠标移动;3.修改窗口左上角的位置(用move实现)
    virtual void mouseMoveEvent(QMouseEvent* event);
    virtual void mousePressEvent(QMouseEvent* event);

private slots:
    void on_quit_clicked();

    void onBtFromClick(int pageId);

    void on_volume_clicked();

    void on_addLocal_clicked();

    void onLrcwordClicked(); // 点击歌词按钮,显示歌词

    // 我喜欢音乐 属性的改变, 触发 updataLikeMusic信号, 该槽函数进行处理
    void updateLikeMusicAndPage(bool isLike, QString musicId);


    // 播放控制区的槽函数
    // 播放按钮(播放, 暂停)
    void onPlayClicked();
    // 点击播放按钮 切换状态 触发信号,调用槽函数改变图片(分离,各做各的事)
    void onPlayerStatusChanged();

    // 播放上一首
    void onPlayUpClicked();
    // 播放下一首
    void onPlayDownClicked();

    // 切换播放模式
    void onPlaybackModeCliked();
    // 切换播放模式,状态发生改变会触发信号,从而切换图片
    void onPlaybackModeChanged(QMediaPlaylist::PlaybackMode playbaclMode);

    // 触发了 播放所有 的按钮信号, 该槽函数进行 播放所有的这个操作
//    void playAll(PageType pageType);
    void playAll(CommonPage* page);
    void playAllOfCommonPage(CommonPage* page, int index);

    // 双击 item项触发信号(返回触发page, 行号), 通知QQMusic 播放音乐
    void playMusicByIndex(CommonPage* page, int index);

    // 播放歌曲切换,index会发生改变, 触发信号,交给该槽函数处理
    void onCurrentIndexChanged(int index);

    // 该槽函数 处理静音操作
    void setPlayerSilence(bool isMuted);

    // 设置音量的槽函数
    void setPlayerVolume(int volumeRatio);

    // 播放歌曲切换,音乐时长也会变化,处理该信号
    void onDurationChanged(qint64 duration);

    // 播放歌曲, 音乐时长不断改变触发信号, 处理该信号
    void onPositionChanged(qint64 position);

    // 进度条改变需要播放时间跟着修改
    void onMusicSliderChanged(float ration);

    void onMetaDataAvailableChanged(bool Available);// 元数据发生改变时,播放下一首歌时

    void on_skin_clicked();
    void on_min_clicked();

private:
    Ui::QQMusic *ui;

    QPoint dragPosition;

    VolumeTool *volumeTool;

    LrcPage* lrcPage;

    QPropertyAnimation* lrcPageAnimal; // 设置 lrcPage 背景上移动画

    MusicList musicList;

    // 媒体播放成员
    QMediaPlayer* player; // 播放器, 控制播放, 播放的状态等
    QMediaPlaylist* playList; // 播放列表, 播放器所要播放的媒体源

    CommonPage* currentPage;// 当前播放窗口
    qint64 totalTime; // 当前播放歌曲的总时长
    int currentIndex; // 当前播放音乐的下标索引

    QSqlDatabase sqlite; // 数据库

    bool isDrag; // 针对于 点击btfrom会出现窗口移动的情况
};
#endif // QQMUSIC_H
